package futbolpredictor;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.text.Normalizer;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Rodrigo
 */
public class PreProcesador {

	private AbstractList<Ejemplo> ejemplos;

	private String deAccent(String str) {
		if (str == null) {
			return null;
		}
		String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
		Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
		return pattern.matcher(nfdNormalizedString).replaceAll("");
	}

	PreProcesador(String archivo) {
		try {
			InputStreamReader fr = new InputStreamReader(new FileInputStream(archivo), Charset.forName("ISO-8859-15"));
			BufferedReader br = new BufferedReader(fr);
			ejemplos = new ArrayList();
			String line;

			// pattern para saber el nombre y el anio de una liga
			Pattern pattNombreAnioLiga = Pattern.compile("(<title>|<TITLE>)(.+?)([0-9]+/?[0-9]*)(</title>|</TITLE>)");
			// pattern para saber donde empieza el torneo
//			Pattern pattNombreTorneo = Pattern.compile("<b><a.*?>([^0-9]+)([0-9]*).*?</a>");
			Pattern pattNombreTorneo = Pattern.compile("(Torneo[^0-9]+)([0-9]*)");
			// pattern para saber el numero ronda (OrdFecha)
			Pattern pattNumeroRonda = Pattern.compile("Round ([0-9]+)");
			// pattern para sacar los datos de un partido
			Pattern pattDatosPartido = Pattern.compile("([^/\\(\\),\\.\"<\\[]*?)([0-9]+)-([0-9]+)([^/\\(\\),\\.\"<\\[]*)");
			// pattern para saber el fin de un torneo
			Pattern pattFinalTable = Pattern.compile("Table:");

			String coma = ",";

			while ((line = deAccent(br.readLine())) != null) {
				//System.out.println(line);
				Matcher mNombreAnioLiga = pattNombreAnioLiga.matcher(line);
				String nombreLiga;
				String anioLiga;
				if (mNombreAnioLiga.find()) {  // Busco donde aparece el nombre de la liga
					nombreLiga = mNombreAnioLiga.group(2).trim().replace(",", "");					
					anioLiga = mNombreAnioLiga.group(3).trim().replace(",", "");
					
					boolean bandera2 = false;
					while (((line != null) && bandera2) || (line = deAccent(br.readLine())) != null) {
						bandera2 = false;
						Matcher mNombreTorneo = pattNombreTorneo.matcher(line);
						String nombreTorneo;
						String anioTorneo;
						if (mNombreTorneo.find()) {  // Busco donde empieza un torneo						
							nombreTorneo = mNombreTorneo.group(1).trim().replace(",", "");
							;
							if (mNombreTorneo.group(2).trim().equals("")) {
								anioTorneo = anioLiga;
							} else {
								anioTorneo = mNombreTorneo.group(2).trim().replace(",", "");
								;
							}
							boolean bandera = false;
							while ((((line != null) && bandera) || ((line = deAccent(br.readLine())) != null)) && !(pattNombreTorneo.matcher(line).find())) {
								bandera = false;
								bandera2 = false;
								Matcher mNumeroRonda = pattNumeroRonda.matcher(line);
								String numeroRonda;
								if (mNumeroRonda.find()) { // Busco las rondas del torneo									
									numeroRonda = mNumeroRonda.group(1).trim().replace(",", "");
									while (((line = deAccent(br.readLine())) != null) && !(pattNumeroRonda.matcher(line).find()) && !(pattNombreTorneo.matcher(line).find()) && !(pattFinalTable.matcher(line).find())) {
										Matcher mDatosPartido = pattDatosPartido.matcher(line);
										String nombreLocal;
										String golesLocal;
										String golesVisitante;
										String nombreVisitante;

										if (mDatosPartido.find()) { // Busco los datos del partido
											nombreLocal = mDatosPartido.group(1).trim().replace(",", "");
											golesLocal = mDatosPartido.group(2).trim().replace(",", "");
											golesVisitante = mDatosPartido.group(3).trim().replace(",", "");
											nombreVisitante = mDatosPartido.group(4).trim().replace(",", "");

											ejemplos.add(new Ejemplo(nombreLiga, nombreTorneo, anioTorneo, numeroRonda, nombreLocal, golesLocal, golesVisitante, nombreVisitante));
										}
									}
									bandera = true;
									bandera2 = true;
								}
							}
							bandera2 = true;
						}
					}
				}
			}

			if (ejemplos.isEmpty()) {
				fr = new InputStreamReader(new FileInputStream(archivo), Charset.forName("ISO-8859-15"));
				br = new BufferedReader(fr);
				while ((line = deAccent(br.readLine())) != null) {
					Matcher mDatosPartido = pattDatosPartido.matcher(line);
					String nombreLocal;
					String golesLocal;
					String golesVisitante;
					String nombreVisitante;

					if (mDatosPartido.find()) { // Busco los datos del partido
						nombreLocal = mDatosPartido.group(1).trim().replace(",", "");
						golesLocal = mDatosPartido.group(2).trim().replace(",", "");
						golesVisitante = mDatosPartido.group(3).trim().replace(",", "");
						nombreVisitante = mDatosPartido.group(4).trim().replace(",", "");

						ejemplos.add(new Ejemplo("-1", "-1", "-1", "-1", nombreLocal, golesLocal, golesVisitante, nombreVisitante));
					}
				}
			}

		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

	void guardarCSV(String archivo) {
		try {
			Writer out = new OutputStreamWriter(new FileOutputStream(archivo, true), Charset.forName("ISO-8859-15"));


//			out.write("OrdFecha, NombreLocal, NombreVisitante, Resultado");
//			out.write(System.getProperty("line.separator"));

			Iterator it = this.ejemplos.iterator();
			while (it.hasNext()) {
				out.write(((Ejemplo) it.next()) + "");
				out.write(System.getProperty("line.separator"));
			}
			out.close();
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

	AbstractList<Ejemplo> getEjemplos() {
		return ejemplos;
	}
}
